﻿// CplusCalPython.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <Python.h>

int main()
{
    // 初始化Python解释器
    Py_Initialize();

    // 定义要导入的Python模块和函数
    const char* moduleName = "mymodule"; // 替换为你的模块名
    const char* functionName = "my_add"; // 替换为你的函数名




   //1.导入Python模块
    PyObject* pModule = PyImport_ImportModule(moduleName);
    if (pModule == nullptr) {
        PyErr_Print();
        std::cerr << "Failed to load Python " << moduleName << std::endl;
        std::cerr << "请把 " << moduleName << ".py  文件拷贝到运行目录下" << std::endl;
        return 1;
    }

    // 2.获取Python函数
    PyObject* pFunc = PyObject_GetAttrString(pModule, functionName);
    if (pFunc == nullptr || !PyCallable_Check(pFunc)) {
        if (PyErr_Occurred()) PyErr_Print();
        std::cerr << "Cannot find function " << functionName << std::endl;
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
        return 1;
    }


    // 3.接受用户输入的两个参数
    int x, y;
    std::cout << "Enter the first number: ";
    std::cin >> x;
    std::cout << "Enter the second number: ";
    std::cin >> y;



    // 4.调用Python函数，并传递参数
    PyObject* pArgs = PyTuple_New(2);
    PyTuple_SetItem(pArgs, 0, PyLong_FromLong(x));
    PyTuple_SetItem(pArgs, 1, PyLong_FromLong(y));
    PyObject* pResult = PyObject_CallObject(pFunc, pArgs);
    Py_DECREF(pArgs);

    // 检查调用结果
    if (pResult == nullptr) {
        PyErr_Print();
        std::cerr << "Call failed" << std::endl;
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
        return 1;
    }

    // 输出结果
    long result = PyLong_AsLong(pResult);
    std::cout << "Result of addition: " << result << std::endl;



    system("pause");

    //方法二
    const char* functionName2 = "my_plot"; // 替换为你的函数名

    PyObject* pFunc2 = PyObject_GetAttrString(pModule, functionName2);
    if (pFunc2 == nullptr || !PyCallable_Check(pFunc2)) {
        if (PyErr_Occurred()) PyErr_Print();
        std::cerr << "Cannot find function " << functionName2 << std::endl;
        Py_XDECREF(pFunc2);
        Py_DECREF(pModule);
        return 1;
    }
    PyObject_CallObject(pFunc2,NULL);
    Py_DECREF(pFunc2);

    // 清理
    Py_DECREF(pResult);
    Py_DECREF(pFunc);
    Py_DECREF(pModule);

    // 结束Python解释器
    Py_Finalize();


    system("pause");

    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
